package com.aotuman.ktcoroutineandroid.chapter.four

import java.util.concurrent.TimeUnit
import kotlin.concurrent.thread
import kotlin.coroutines.*


suspend fun mySuspendCoroutine() = suspendCoroutine<String> { continuation ->
    // 传入的continuation就是SuspendLambda对象，也就是我们自己写一个lambda编译后的对象
    // 启动一个线程。一秒后回调continuation函数
    thread {
        println("子线程模拟获取网络数据【开始】")
        TimeUnit.SECONDS.sleep(1)
        println("子线程获取数据【结束】，调用Continuation返回结果：hello world")
        //调用又会重新调用BaseContinuationImpl的resumeWith函数
        continuation.resume("hello world")
    }

    println("子线程还没有执行完，mySuspendCoroutine函数暂时返回COROUTINE_SUSPENDED")
    // 子线程还没有执行完，mySuspendCoroutine函数暂时返回挂起标识COROUTINE_SUSPENDED
    // 否则BaseContinuationImpl会认为完成了任务
    kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED
}

fun main() {
    suspend {
        mySuspendCoroutine()
    }.startCoroutine(object : Continuation<String>{
        override val context: CoroutineContext
            get() = EmptyCoroutineContext

        override fun resumeWith(result: Result<String>) {
            println("监听者获取到结果：${result.getOrNull()}")
        }

    })
}
